//! https://leetcode-cn.com/problems/isomorphic-strings/
//! 205. 同构字符串
//! 给定两个字符串 s 和 t，判断它们是否是同构的。
//! 如果 s 中的字符可以被替换得到 t ，那么这两个字符串是同构的。
//! 所有出现的字符都必须用另一个字符替换，同时保留字符的顺序。
//! 两个字符不能映射到同一个字符上，但字符可以映射自己本身。
pub struct Solution {}

#[allow(dead_code)]
impl Solution {
    pub fn is_isomorphic(s: String, t: String) -> bool {
        let (s, t) = (s.into_bytes(), t.into_bytes());
        let (mut m, mut m2) = ([0; 128], [0; 128]);

        for i in 0..s.len() {
            let (a, b) = (s[i] as usize, t[i] as usize);

            if m[a] != m2[b] {
                return false;
            } else if m[a] == 0 {
                m[a] = i + 1;
                m2[b] = i + 1;
            }
        }

        true
    }
}

#[cfg(test)]
mod test {
    use super::*;
    #[test]
    fn test() {
        assert!(Solution::is_isomorphic(
            "egg".to_string(),
            "add".to_string()
        ));

        assert!(!Solution::is_isomorphic(
            "foo".to_string(),
            "bar".to_string()
        ));

        assert!(Solution::is_isomorphic(
            "paper".to_string(),
            "title".to_string()
        ));
    }
}
